home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
sound
/
players
/
naudio.lzh
/
naudio
/
doc
/
tutori_s.txt
< prev
Wrap
Text File
|
1993-11-23
|
19KB
|
493 lines
Einführung
NAUDIO Die Samplelibrary Mulle KybernetiK
Version 1.0
Copyright auf Dokumentation and Programmcode
© 1993 Mulle KybernetiK
"Bang that bit that doesn't bang"
Copyright 1993 Mulle KybernetiK
Alle Rechte Vorbehalten.
Das Werk einschließlich seiner Teile ist urheberrechtlich geschützt.
Das vorliegende Werk darf, auch auszugsweise, ohne schriftliche Genehmigung
von Mulle KybernetiK weder reproduziert, übertragen umgeschrieben auf Da-
tenträgern gespeichert oder in eine andere Sprache übersetzt werden, weder in
mechanischer, elektronischer, positronischer, magnetischer, optischer, chemi-
scher oder biologischer Form.
Geschrieben, gesetzt und gedruckt mit Tempus-WORD auf ATARI.
1. Auflage Mulle KybernetiK 1993, Bochum
Printed in Germany
Mulle KybernetiK
c/o Wallmann
Buchenweg 2
5810 Witten-Buchholz
Germany
1-Der schnelle Weg zum Erfolg
Die nun folgenden "Wege zum Erfolg" reizen die Möglichkeiten der NAU-
DIO-Bücherei bei weitem nicht aus. Wenn sie also über die hier vorgestell-
te Funktionalität hinausgehen wollen, sollten sie das "Technische Manual"
und das "Reference Manual" studieren.
1.1 Am Anfang war das Programm
und der Compiler sah, daß es gut war.
Das folgende kleine Beispielprogramm demonstriert in ca. 50 Zeilen be-
reits die wichtigsten Funktionen der NAUDIO-Bibliothek. Es mag durch-
aus der Fall sein, daß sie nie weiter als dieses Kapitel lesen brauchen,
wenn sie einfach nur auf relativ portable Art und Weise Samples auf allen
möglichen Atari-Computern(1) abspielen wollen.
Zu Beginn einer C-Datei, die NAUDIO-Bibliotheken verwendet, sollte im-
mer die Anweisung #include <naudio\naudio.h> stehen. Damit werden
sämtliche für NAUDIO benötigten Includedateien geladen. Da wir fprintf
für Demonstrationszwecke verwenden wollen, binden wir in diesem Bei-
spiel (Reihenfolge übrigens unwichtig) auch noch die C-Standardbibli-
othek <stdio.h> ein.
Die Definition der Funktion error übergehen wir einstweilen und wenden
uns gleich dem Hauptteil main zu:
#include <naudio\naudio.h>
#include <stdio.h>
void error( s)
char *s;
{
fprintf( stderr, "demo: Error \"%s\"\n", s);
naudio_done();
exit( 1);
}
main()
{
n_sample *p;
naudio_init();
naudio_all();
if( naudio_engine( SAMPLES) >= 0)
{
if( p = nsample_load( "zarths.smp"))
{
channel *q;
if( ! naudio_start( 0))
{
if( q = nsample_play( p, 0L, NAUDIO_MAX_VOL, 1))
{
while( q->play);/* warten auf Godot */
naudio_stop();
channel_free( q);
}
else
error( "Kein Kanal mehr vorhanden");
naudio_stop();
}
else
error( "Versagen des Starters");
nsample_free( p);
}
else
error( "Sample nicht geladen");
naudio_done();
}
else
error( "Engine nicht initialisiert");
return( 0);
}
Zufürdererst sollte jedes NAUDIO-Programm die Routine naudio_init
aufrufen. Diese setzt einige wichtige interne Werte, die für einen
reibungslosen Ablauf von Nöten sind, nachdem sie die verfügbare
Hardware analysiert hat. Danach sollten sie sich entscheiden ob sie alle
Enginetypen einbinden wollen (naudio_all) oder nur die wichtigsten
(naudio_some). Je weniger sie einbinden, desto kleiner wird auch ihre
Programm, und in den meisten Fällen ist naudio_some völlig
ausreichend.
if( naudio_engine( SAMPLES) >= 0)
Danach wird das Audiosystem für das Abspielen von Samples durch
naudio_engine vorbereitet. Der Rückgabewert ist bei Erfolg positiv oder
0, so daß wir jetzt beruhigt ein Sample aus einer Datei laden können. Bis
jetzt findet noch keine Sounderzeugung statt!
if( q = nsample_play( p, 0L, NAUDIO_MAX_VOL, 1))
Zum Laden eines Samples aus einer Datei verwendet man die Funktion
nsample_load, die im Erfolgsfall einen Zeiger auf ein n_sample
zurückgibt. Ein n_sample ist eine Struktur die Informationen über das
Sample wie dessen Länge und dessen Samplewerte beinhaltet. (In main
haben wir als erstes ein Zeiger auf ein solches n_sample definiert).
Nehmen wir an, daß das Sample tatsächlich geladen wurde (der Wert von
p also nicht NULL ist), so wird als nächstes mit naudio_start das Sound-
system angeworfen. Ab jetzt werden also Samplewerte an die Hardware
ausgegeben. Da wir aber kein Sample zum Abspielen designiert haben,
dürfte vorläufig immer noch nichts zu hören sein.
if( q = nsample_play( p, 0L, NAUDIO_MAX_VOL, 1))
Mit nsample_play wird ein Kanal des Soundsystems reserviert und ein
Sample auf ihm gespielt. Der Rückgabewert der Funktion ist ein Zeiger
auf den reservierten Kanal. Auf einem solchen Kanal kann übrigens zu ei-
nem Zeitpunkt immer nur ein monophones Sample gespielt werden.
Das erste Argument der Funktion ist die Adresse des geladenen Sam-
ples, welches wir spielen möchten (Im Beispiel: der Wert von p). Mit dem
zweiten Parameter, den wir auf 0 gesetzt haben, legen wir fest, daß das
Sample mit der Frequenz gespielt werden soll, mit der es aufgenommen
wurde(2). Der dritte Parameter setzt die Lautstärke auf Maximum. Der
vierte Parameter bedeutet nsample_play, daß mit dem Abspielen des
Sample sofort begonnen werden soll.
Über den ->play Eintrag des Kanals warten wir darauf, daß das Sample
fertig ist. Natürlich könnte man hier auch noch etwas nützlicheres ma-
chen, da das Sample, egal auf welcher Hardware, immer im Hintergrund
gespielt wird. Solange ->play nicht 0 ist, wird das Sample noch
gespielt.(3)
ACHTUNG: Wichtig ist die Unterscheidung zwischen geladenen Samples
(n_sample) und den Kanälen des Soundsystems (channel). Die jeweili-
gen Strukturen sind unterschiedlich und sollten nicht miteinander
verwechselt werden.
Aus didaktischen Gründen schalten wir das Soundsystem mit nau-
dio_stop nach Beendigung des Samples sofort wieder aus. Dies spart im
übrigen auch in jedem Fall, auch auf dem STE oder Falcon, Prozessorzeit.
Anschließend geben wir den Kanal mit channel_free wieder frei. Möchte
man in eigenen Programmen mehrere Samples nacheinander spielen, so
ist dies empfehlenswert(4), da naudio_play immer versucht einen neuen
Kanal zu reservieren. Hat man aber nie einen Kanal zurückgegeben, ist ir-
gendwann mal Schluß, da die Zahl der Kanäle auf acht beschränkt ist.
Da wir mit dem Soundsystem nichts mehr vorhaben, können wir
naudio_done aufrufen. Dieser Aufruf muß, nachdem naudio_engine(5)
einmal aufgerufen wurde, vor Beendigung des Programms gemacht
werden. Nichtbeachtung dieser Regel wird üblicherweise mit schweren
Crashs nicht unter zwei Bomben bestraft.
Wie man aus der Definition und Benutzung der error-Funktion im Bei-
spielprogramm ersehen kann, ist ein überflüssiger Aufruf von nau-
dio_done jedoch völlig unschädlich.
Auch geladene Samples sollten sobald wie möglich der Wiederverwer-
tung zugeführt werden, da Samples im allgemeinen speicherfressende
Dinger sind. Eines mit nsample_load geladenes Samples entledigt man
sich mittels nsample_free.
1.1.1 AUS!
Einen Kanal kann man auch vorzeitig mit channel_stop auschalten. Ein
Ausschalten mit gleichzeitigem Freigeben erfolgt via channel_delete. Mit
diesem Wissen können wir nun eine kleine C-Funktion schreiben,. die ein
Sample aus einer Datei liest, dieses spielt und zurückkehrt, wenn entwe-
der eine Taste auf dem Keyboard gedrüct wurde oder das Sample ver-
klungen ist:
void load_n_play( char *filename)
{
n_sample *p;
channel *q;
if( p = nsample_load( filename))/* laden, != 0 bei Erfolg */
{
if( q = nsample_play( p, 0L, NAUDIO_MAX_VOL, 1))/* spielen*/
{
while( q->play)/* so lange der channel aktiv ist */
{
if( Bconstat( 2))/* Taste gedrueckt ? */
{
Bconin(2);/* Taste einlesen & ignorieren */
channel_stop( q);/* ja, dann Kanal aus */
break;
}
}
channel_free( q);/* Kana